package com.cencat.order.service;

import com.cencat.order.domain.Merchant;
import com.cencat.order.domain.MerchantDriver;
import com.cencat.order.domain.MerchantOrder;
import com.cencat.order.domain.MerchantBill;
import com.cencat.order.domain.vo.MerchantVO;
import com.cencat.order.domain.vo.MerchantStatisticsVO;
import com.cencat.order.domain.vo.MerchantAnalysisVO;
import com.cencat.order.domain.dto.MerchantCreateDTO;
import com.cencat.order.domain.dto.MerchantUpdateDTO;
import com.cencat.order.domain.dto.QuickOrderDTO;
import com.cencat.order.domain.dto.MerchantDriverBindDTO;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;

/**
 * 固定商家管理服务接口
 * 
 * @author cencat
 * @date 2024-01-20
 */
public interface IMerchantService extends IService<Merchant> {

    /**
     * 查询商家列表
     * 
     * @param merchant 商家查询条件
     * @return 商家列表
     */
    List<Merchant> selectMerchantList(Merchant merchant);

    /**
     * 获取商家详情
     * 
     * @param merchantId 商家ID
     * @return 商家详情VO
     */
    MerchantVO getMerchantDetail(Long merchantId);

    /**
     * 新增商家
     * 
     * @param createDTO 创建商家DTO
     * @return 商家详情VO
     */
    MerchantVO createMerchant(MerchantCreateDTO createDTO);

    /**
     * 修改商家
     * 
     * @param updateDTO 更新商家DTO
     * @return 是否成功
     */
    boolean updateMerchant(MerchantUpdateDTO updateDTO);

    /**
     * 删除商家
     * 
     * @param merchantIds 商家ID数组
     * @return 是否成功
     */
    boolean deleteMerchantByIds(Long[] merchantIds);

    /**
     * 商家状态管理
     */
    
    /**
     * 启用商家
     * 
     * @param merchantId 商家ID
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean enableMerchant(Long merchantId, Long operatorId);

    /**
     * 禁用商家
     * 
     * @param merchantId 商家ID
     * @param reason 禁用原因
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean disableMerchant(Long merchantId, String reason, Long operatorId);

    /**
     * 批量更新商家状态
     * 
     * @param merchantIds 商家ID数组
     * @param status 状态
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean batchUpdateStatus(Long[] merchantIds, String status, Long operatorId);

    /**
     * 商家认证
     * 
     * @param merchantId 商家ID
     * @param authType 认证类型
     * @param authData 认证数据
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean authenticateMerchant(Long merchantId, String authType, String authData, Long operatorId);

    /**
     * 司机绑定管理
     */
    
    /**
     * 绑定司机到商家
     * 
     * @param bindDTO 绑定DTO
     * @return 是否成功
     */
    boolean bindDriverToMerchant(MerchantDriverBindDTO bindDTO);

    /**
     * 解绑司机
     * 
     * @param merchantId 商家ID
     * @param driverId 司机ID
     * @param reason 解绑原因
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean unbindDriverFromMerchant(Long merchantId, Long driverId, String reason, Long operatorId);

    /**
     * 获取商家绑定的司机列表
     * 
     * @param merchantId 商家ID
     * @param status 绑定状态
     * @return 司机列表
     */
    List<MerchantDriver> getMerchantDrivers(Long merchantId, String status);

    /**
     * 批量绑定司机
     * 
     * @param merchantId 商家ID
     * @param driverIds 司机ID数组
     * @param bindType 绑定类型
     * @param operatorId 操作人ID
     * @return 绑定结果
     */
    Map<String, Object> batchBindDrivers(Long merchantId, Long[] driverIds, String bindType, Long operatorId);

    /**
     * 快捷下单
     */
    
    /**
     * 快捷下单
     * 
     * @param quickOrderDTO 快捷下单DTO
     * @return 订单ID
     */
    Long createQuickOrder(QuickOrderDTO quickOrderDTO);

    /**
     * 获取快捷下单模板
     * 
     * @param merchantId 商家ID
     * @param templateType 模板类型
     * @return 模板列表
     */
    List<Map<String, Object>> getQuickOrderTemplates(Long merchantId, String templateType);

    /**
     * 保存快捷下单模板
     * 
     * @param merchantId 商家ID
     * @param templateName 模板名称
     * @param templateData 模板数据
     * @return 模板ID
     */
    Long saveQuickOrderTemplate(Long merchantId, String templateName, String templateData);

    /**
     * 订单管理
     */
    
    /**
     * 获取商家订单列表
     * 
     * @param merchantId 商家ID
     * @param status 订单状态
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 订单列表
     */
    List<MerchantOrder> getMerchantOrders(Long merchantId, String status, String startDate, String endDate);

    /**
     * 取消商家订单
     * 
     * @param orderId 订单ID
     * @param merchantId 商家ID
     * @param cancelReason 取消原因
     * @return 是否成功
     */
    boolean cancelMerchantOrder(Long orderId, Long merchantId, String cancelReason);

    /**
     * 修改订单信息
     * 
     * @param orderId 订单ID
     * @param merchantId 商家ID
     * @param updateData 更新数据
     * @return 是否成功
     */
    boolean updateMerchantOrder(Long orderId, Long merchantId, Map<String, Object> updateData);

    /**
     * 配送分析
     */
    
    /**
     * 获取商家配送分析
     * 
     * @param merchantId 商家ID
     * @param analysisType 分析类型
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 配送分析VO
     */
    MerchantAnalysisVO getMerchantDeliveryAnalysis(Long merchantId, String analysisType, String startDate, String endDate);

    /**
     * 获取配送效率分析
     * 
     * @param merchantId 商家ID
     * @param timeRange 时间范围
     * @return 效率分析数据
     */
    Map<String, Object> getDeliveryEfficiencyAnalysis(Long merchantId, String timeRange);

    /**
     * 获取配送成本分析
     * 
     * @param merchantId 商家ID
     * @param costType 成本类型
     * @param timeRange 时间范围
     * @return 成本分析数据
     */
    Map<String, Object> getDeliveryCostAnalysis(Long merchantId, String costType, String timeRange);

    /**
     * 统计信息
     */
    
    /**
     * 获取商家统计信息
     * 
     * @param merchantId 商家ID
     * @param statisticsType 统计类型
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 统计信息VO
     */
    MerchantStatisticsVO getMerchantStatistics(Long merchantId, String statisticsType, String startDate, String endDate);

    /**
     * 获取收入分析
     * 
     * @param merchantId 商家ID
     * @param timeRange 时间范围
     * @param incomeType 收入类型
     * @return 收入分析数据
     */
    Map<String, Object> getIncomeAnalysis(Long merchantId, String timeRange, String incomeType);

    /**
     * 获取成本分析
     * 
     * @param merchantId 商家ID
     * @param timeRange 时间范围
     * @param costType 成本类型
     * @return 成本分析数据
     */
    Map<String, Object> getCostAnalysis(Long merchantId, String timeRange, String costType);

    /**
     * 获取效率分析
     * 
     * @param merchantId 商家ID
     * @param timeRange 时间范围
     * @param efficiencyType 效率类型
     * @return 效率分析数据
     */
    Map<String, Object> getEfficiencyAnalysis(Long merchantId, String timeRange, String efficiencyType);

    /**
     * 评价管理
     */
    
    /**
     * 获取商家评价列表
     * 
     * @param merchantId 商家ID
     * @param rating 评分
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 评价列表
     */
    List<Map<String, Object>> getMerchantEvaluations(Long merchantId, Integer rating, String startDate, String endDate);

    /**
     * 回复评价
     * 
     * @param evaluationId 评价ID
     * @param merchantId 商家ID
     * @param replyContent 回复内容
     * @return 是否成功
     */
    boolean replyEvaluation(Long evaluationId, Long merchantId, String replyContent);

    /**
     * 获取评价统计
     * 
     * @param merchantId 商家ID
     * @param timeRange 时间范围
     * @return 评价统计数据
     */
    Map<String, Object> getEvaluationStatistics(Long merchantId, String timeRange);

    /**
     * 设置管理
     */
    
    /**
     * 获取商家设置
     * 
     * @param merchantId 商家ID
     * @param settingType 设置类型
     * @return 设置信息
     */
    Map<String, Object> getMerchantSettings(Long merchantId, String settingType);

    /**
     * 更新商家设置
     * 
     * @param merchantId 商家ID
     * @param settingType 设置类型
     * @param settingData 设置数据
     * @return 是否成功
     */
    boolean updateMerchantSettings(Long merchantId, String settingType, Map<String, Object> settingData);

    /**
     * 重置商家设置
     * 
     * @param merchantId 商家ID
     * @param settingType 设置类型
     * @return 是否成功
     */
    boolean resetMerchantSettings(Long merchantId, String settingType);

    /**
     * 通知管理
     */
    
    /**
     * 发送通知给商家
     * 
     * @param merchantId 商家ID
     * @param notificationType 通知类型
     * @param title 标题
     * @param content 内容
     * @param senderId 发送人ID
     * @return 通知ID
     */
    Long sendNotificationToMerchant(Long merchantId, String notificationType, String title, String content, Long senderId);

    /**
     * 获取商家通知列表
     * 
     * @param merchantId 商家ID
     * @param notificationType 通知类型
     * @param status 状态
     * @return 通知列表
     */
    List<Map<String, Object>> getMerchantNotifications(Long merchantId, String notificationType, String status);

    /**
     * 标记通知已读
     * 
     * @param notificationId 通知ID
     * @param merchantId 商家ID
     * @return 是否成功
     */
    boolean markNotificationAsRead(Long notificationId, Long merchantId);

    /**
     * 账单管理
     */
    
    /**
     * 生成商家账单
     * 
     * @param merchantId 商家ID
     * @param billType 账单类型
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 账单ID
     */
    Long generateMerchantBill(Long merchantId, String billType, String startDate, String endDate);

    /**
     * 获取商家账单列表
     * 
     * @param merchantId 商家ID
     * @param billType 账单类型
     * @param status 状态
     * @return 账单列表
     */
    List<MerchantBill> getMerchantBills(Long merchantId, String billType, String status);

    /**
     * 确认账单
     * 
     * @param billId 账单ID
     * @param merchantId 商家ID
     * @param confirmData 确认数据
     * @return 是否成功
     */
    boolean confirmMerchantBill(Long billId, Long merchantId, Map<String, Object> confirmData);

    /**
     * 数据导出导入
     */
    
    /**
     * 导出商家数据
     * 
     * @param merchantIds 商家ID数组
     * @param exportType 导出类型
     * @param exportFields 导出字段
     * @return 导出文件路径
     */
    String exportMerchantData(Long[] merchantIds, String exportType, String[] exportFields);

    /**
     * 导入商家数据
     * 
     * @param merchantList 商家列表
     * @param importType 导入类型
     * @return 导入结果消息
     */
    String importMerchantData(List<Merchant> merchantList, String importType);

    /**
     * 区域管理
     */
    
    /**
     * 获取商家服务区域
     * 
     * @param merchantId 商家ID
     * @return 服务区域列表
     */
    List<Map<String, Object>> getMerchantServiceAreas(Long merchantId);

    /**
     * 设置商家服务区域
     * 
     * @param merchantId 商家ID
     * @param areaData 区域数据
     * @return 是否成功
     */
    boolean setMerchantServiceAreas(Long merchantId, List<Map<String, Object>> areaData);

    /**
     * 检查商家服务范围
     * 
     * @param merchantId 商家ID
     * @param latitude 纬度
     * @param longitude 经度
     * @return 是否在服务范围内
     */
    boolean checkServiceRange(Long merchantId, Double latitude, Double longitude);

    /**
     * 优惠管理
     */
    
    /**
     * 获取商家优惠活动
     * 
     * @param merchantId 商家ID
     * @param activityType 活动类型
     * @param status 状态
     * @return 优惠活动列表
     */
    List<Map<String, Object>> getMerchantPromotions(Long merchantId, String activityType, String status);

    /**
     * 创建优惠活动
     * 
     * @param merchantId 商家ID
     * @param promotionData 优惠数据
     * @return 活动ID
     */
    Long createMerchantPromotion(Long merchantId, Map<String, Object> promotionData);

    /**
     * 更新优惠活动
     * 
     * @param promotionId 活动ID
     * @param merchantId 商家ID
     * @param updateData 更新数据
     * @return 是否成功
     */
    boolean updateMerchantPromotion(Long promotionId, Long merchantId, Map<String, Object> updateData);

    /**
     * 性能监控
     */
    
    /**
     * 获取商家性能监控
     * 
     * @param merchantId 商家ID
     * @param monitorType 监控类型
     * @return 监控数据
     */
    Map<String, Object> getMerchantPerformanceMonitoring(Long merchantId, String monitorType);

    /**
     * 设置性能预警
     * 
     * @param merchantId 商家ID
     * @param alertType 预警类型
     * @param alertRule 预警规则
     * @return 是否成功
     */
    boolean setPerformanceAlert(Long merchantId, String alertType, Map<String, Object> alertRule);

    /**
     * 系统管理
     */
    
    /**
     * 商家健康检查
     * 
     * @param merchantId 商家ID
     * @return 健康状态
     */
    Map<String, Object> merchantHealthCheck(Long merchantId);

    /**
     * 数据同步
     * 
     * @param merchantId 商家ID
     * @param syncType 同步类型
     * @return 是否成功
     */
    boolean syncMerchantData(Long merchantId, String syncType);

    /**
     * 缓存刷新
     * 
     * @param merchantId 商家ID
     * @param cacheType 缓存类型
     * @return 是否成功
     */
    boolean refreshMerchantCache(Long merchantId, String cacheType);

    /**
     * 获取附近商家
     * 
     * @param latitude 纬度
     * @param longitude 经度
     * @param radius 半径(米)
     * @param merchantType 商家类型
     * @return 附近商家列表
     */
    List<Map<String, Object>> getNearbyMerchants(Double latitude, Double longitude, Integer radius, String merchantType);

    /**
     * 商家推荐
     * 
     * @param userId 用户ID
     * @param recommendType 推荐类型
     * @param location 位置信息
     * @return 推荐商家列表
     */
    List<Map<String, Object>> getRecommendedMerchants(Long userId, String recommendType, String location);
}